React'in Eşzamanlı Modu'nu ve kesintili render'ı keşfedin. Bu paradigma değişiminin uygulama performansını, duyarlılığını ve kullanıcı deneyimini küresel olarak nasıl iyileştirdiğini öğrenin.
React Eşzamanlı Modu: Gelişmiş Kullanıcı Deneyimleri için Kesintili Render'da Uzmanlaşma
Front-end geliştirmenin sürekli gelişen dünyasında, kullanıcı deneyimi (UX) her şeyden önemlidir. Dünyanın dört bir yanındaki kullanıcılar, cihazları, ağ koşulları veya eldeki görevin karmaşıklığı ne olursa olsun, uygulamaların hızlı, akıcı ve duyarlı olmasını bekler. React gibi kütüphanelerdeki geleneksel render mekanizmaları, özellikle kaynak yoğun işlemler sırasında veya birden fazla güncelleme tarayıcının dikkatini çekmek için yarıştığında bu talepleri karşılamakta zorlanır. İşte bu noktada React'in Eşzamanlı Modu (artık genellikle React'te eşzamanlılık olarak anılır) devreye giriyor ve devrim niteliğinde bir kavram sunuyor: kesintili render (interruptible rendering). Bu blog yazısı, Eşzamanlı Mod'un inceliklerine inerek kesintili render'ın ne anlama geldiğini, neden oyunun kurallarını değiştirdiğini ve küresel bir kitle için olağanüstü kullanıcı deneyimleri oluşturmak için bundan nasıl yararlanabileceğinizi açıklıyor.
Geleneksel Render'ın Sınırlılıklarını Anlamak
Eşzamanlı Mod'un dehasına dalmadan önce, React'in tarihsel olarak kullandığı geleneksel, senkron render modelinin ortaya çıkardığı zorlukları anlamak önemlidir. Senkron bir modelde, React kullanıcı arayüzü güncellemelerini tek tek, engelleyici bir şekilde işler. Uygulamanızı tek şeritli bir otoyol olarak hayal edin. Bir render görevi başladığında, başka bir görev başlayamadan yolculuğunu tamamlamalıdır. Bu, kullanıcı deneyimini engelleyen birkaç soruna yol açabilir:
- Arayüz Donması: Karmaşık bir bileşenin render edilmesi uzun sürerse, tüm kullanıcı arayüzü yanıt vermez hale gelebilir. Kullanıcılar bir düğmeye tıklayabilir, ancak uzun bir süre hiçbir şey olmaz, bu da hayal kırıklığına yol açar.
- Atlanan Kareler: Ağır render görevleri sırasında, tarayıcının kareler arasında ekranı boyamak için yeterli zamanı olmayabilir, bu da kesik kesik, takılan bir animasyon deneyimine neden olur. Bu özellikle zorlu animasyonlarda veya geçişlerde fark edilir.
- Zayıf Duyarlılık: Ana render engelliyor olsa bile, kullanıcılar uygulamanın diğer bölümleriyle etkileşime girebilir. Ancak, ana iş parçacığı meşgulse, bu etkileşimler gecikebilir veya göz ardı edilebilir, bu da uygulamanın yavaş hissettirmesine neden olur.
- Verimsiz Kaynak Kullanımı: Bir görev render edilirken, mevcut render görevi duraklatılabilir veya önceliklendirilebilir olsa bile, potansiyel olarak daha yüksek öncelikli diğer görevler bekliyor olabilir.
Yaygın bir senaryoyu düşünün: bir kullanıcı arama çubuğuna yazarken, arka planda büyük bir veri listesi alınıyor ve render ediliyor. Senkron bir modelde, listenin render edilmesi arama çubuğunun girdi işleyicisini engelleyebilir ve yazma deneyimini gecikmeli hale getirebilir. Daha da kötüsü, liste çok büyükse, render tamamlanana kadar tüm uygulama donmuş gibi hissedilebilir.
Eşzamanlı Mod ile Tanışma: Bir Paradigma Değişimi
Eşzamanlı Mod, geleneksel anlamda "açtığınız" bir özellik değildir; daha ziyade, kesintili render gibi özellikleri etkinleştiren React için yeni bir çalışma modudur. Özünde, eşzamanlılık, React'in birden fazla render görevini aynı anda yönetmesine ve bu görevleri gerektiğinde kesintiye uğratmasına, duraklatmasına ve devam ettirmesine olanak tanır. Bu, güncellemeleri aciliyetlerine ve önemlerine göre önceliklendiren gelişmiş bir zamanlayıcı aracılığıyla gerçekleştirilir.
Otoyol benzetmemizi tekrar düşünün, ancak bu sefer birden fazla şerit ve trafik yönetimi var. Eşzamanlı Mod, şunları yapabilen akıllı bir trafik denetleyicisi sunar:
- Şeritleri Önceliklendirme: Acil trafiği (kullanıcı girdisi gibi) temiz şeritlere yönlendirme.
- Duraklatma ve Devam Etme: Yavaş hareket eden, daha az acil bir aracı (uzun bir render görevi) geçici olarak durdurarak daha hızlı, daha önemli araçların geçmesine izin verme.
- Şerit Değiştirme: Değişen önceliklere göre farklı render görevleri arasında sorunsuz bir şekilde odak değiştirme.
Senkron, tek tek işlemden asenkron, önceliklendirilmiş görev yönetimine bu temel geçiş, kesintili render'ın özüdür.
Kesintili Render Nedir?
Kesintili render, React'in bir render görevini yürütmenin ortasında duraklatma ve daha sonra devam ettirme veya daha yeni, daha yüksek öncelikli bir güncelleme lehine kısmen render edilmiş bir çıktıyı terk etme yeteneğidir. Bu, uzun süren bir render işleminin daha küçük parçalara ayrılabileceği ve React'in bu parçalar ile diğer görevler (kullanıcı girdisine yanıt vermek gibi) arasında gerektiği gibi geçiş yapabileceği anlamına gelir.
Kesintili render'ı sağlayan temel kavramlar şunlardır:
- Zaman Dilimleme (Time Slicing): React, render görevlerine bir "zaman dilimi" ayırabilir. Bir görev ayrılan zaman dilimini aşarsa, React onu duraklatabilir ve daha sonra devam ettirebilir, böylece ana iş parçacığını engellemesini önler.
- Önceliklendirme: Zamanlayıcı, farklı güncellemelere öncelikler atar. Kullanıcı etkileşimleri (yazma veya tıklama gibi) genellikle arka planda veri çekme veya daha az kritik arayüz güncellemelerinden daha yüksek önceliğe sahiptir.
- Öncelik Devralma (Preemption): Daha yüksek öncelikli bir güncelleme, daha düşük öncelikli bir güncellemeyi kesintiye uğratabilir. Örneğin, büyük bir bileşen render edilirken bir kullanıcı arama çubuğuna yazarsa, React bileşenin render edilmesini duraklatabilir, kullanıcı girdisini işleyebilir, arama çubuğunu güncelleyebilir ve ardından potansiyel olarak bileşenin render edilmesine daha sonra devam edebilir.
Bu "kesintiye uğratma" ve "devam ettirme" yeteneği, React'in eşzamanlılığını bu kadar güçlü kılan şeydir. Bu, uygulama karmaşık render görevleri gerçekleştirirken bile arayüzün duyarlı kalmasını ve kritik kullanıcı etkileşimlerinin derhal ele alınmasını sağlar.
Temel Özellikler ve Eşzamanlılığı Nasıl Sağladıkları
Eşzamanlı Mod, kesintili render temelinde oluşturulmuş birkaç güçlü özelliğin kilidini açar. En önemlilerinden bazılarını inceleyelim:
1. Veri Çekme için Suspense
Suspense, React bileşenleriniz içinde veri çekme gibi asenkron işlemleri yönetmenin bildirimsel bir yoludur. Önceden, birden fazla asenkron işlem için yükleme durumlarını yönetmek karmaşık hale gelebilir ve iç içe koşullu render'a yol açabilirdi. Suspense bunu önemli ölçüde basitleştirir.
Eşzamanlılıkla nasıl çalışır: Suspense kullanan bir bileşen veri çekmesi gerektiğinde, render'ı "askıya alır" ve bir yedek arayüz (örneğin, bir yükleme çarkı) gösterir. React'in zamanlayıcısı daha sonra bu bileşenin render edilmesini arayüzün geri kalanını engellemeden duraklatabilir. Bu sırada, diğer güncellemeleri veya kullanıcı etkileşimlerini işleyebilir. Veri çekildiğinde, bileşen gerçek veriyle render edilmeye devam edebilir. Bu kesintili doğa çok önemlidir; React veri beklerken takılıp kalmaz.
Küresel Örnek: Tokyo'daki bir kullanıcının bir ürün sayfasını incelediği küresel bir e-ticaret platformu hayal edin. Eşzamanlı olarak, Londra'daki bir kullanıcı sepetine bir ürün ekliyor ve New York'taki başka bir kullanıcı bir ürün arıyor. Tokyo'daki ürün sayfası, birkaç saniye süren ayrıntılı özelliklerin çekilmesini gerektiriyorsa, Suspense, uygulamanın geri kalanının (Londra'daki sepet veya New York'taki arama gibi) tamamen duyarlı kalmasını sağlar. React, Tokyo ürün sayfasının render edilmesini duraklatabilir, Londra sepet güncellemesini ve New York aramasını işleyebilir ve ardından verileri hazır olduğunda Tokyo sayfasını devam ettirebilir.
Kod Parçacığı (Örnek):
// Promise döndüren bir fetchData fonksiyonu hayal edin
function fetchUserData() {
return new Promise(resolve => {
setTimeout(() => {
resolve({ name: 'Alice' });
}, 2000);
});
}
// Varsayımsal bir Suspense etkin veri çekme hook'u
function useUserData() {
const data = fetch(url);
if (data.status === 'pending') {
throw new Promise(resolve => {
// Suspense'in yakaladığı şey budur
setTimeout(() => resolve(null), 2000);
});
}
return data.value;
}
function UserProfile() {
const userData = useUserData(); // Bu çağrı askıya alabilir
return Hoşgeldin, {userData.name}!;
}
function App() {
return (
Kullanıcı yükleniyor...
2. Otomatik Gruplama (Automatic Batching)
Gruplama, birden fazla durum güncellemesini tek bir yeniden render'da birleştirme işlemidir. Geleneksel olarak, React yalnızca olay işleyicileri içinde gerçekleşen güncellemeleri gruplandırırdı. Olay işleyicileri dışında başlatılan güncellemeler (örneğin, promise'ler veya `setTimeout` içinde) gruplandırılmazdı, bu da gereksiz yeniden render'lara yol açardı.
Eşzamanlılıkla nasıl çalışır: Eşzamanlı Mod ile React, nereden kaynaklandıklarına bakılmaksızın tüm durum güncellemelerini otomatik olarak gruplandırır. Bu, hızlı bir şekilde art arda gerçekleşen birkaç durum güncellemeniz varsa (örneğin, tamamlanan birden fazla asenkron işlemden), React'in bunları gruplayacağı ve tek bir yeniden render gerçekleştireceği anlamına gelir, bu da performansı artırır ve çoklu render döngülerinin ek yükünü azaltır.
Örnek: İki farklı API'den veri çektiğinizi varsayalım. Her ikisi de tamamlandığında, iki ayrı durum parçasını güncellersiniz. Eski React sürümlerinde bu, iki yeniden render'ı tetikleyebilirdi. Eşzamanlı Mod'da bu güncellemeler gruplandırılır ve tek, daha verimli bir yeniden render ile sonuçlanır.
3. Geçişler (Transitions)
Geçişler, acil ve acil olmayan güncellemeler arasında ayrım yapmak için sunulan yeni bir kavramdır. Bu, kesintili render'ı etkinleştirmek için temel bir mekanizmadır.
Acil Güncellemeler: Bunlar, bir giriş alanına yazmak, bir düğmeye tıklamak veya arayüz öğelerini doğrudan manipüle etmek gibi anında geri bildirim gerektiren güncellemelerdir. Anlık hissedilmelidirler.
Geçiş Güncellemeleri: Bunlar, daha uzun sürebilen ve anında geri bildirim gerektirmeyen güncellemelerdir. Örnekler arasında bir bağlantıya tıkladıktan sonra yeni bir sayfa oluşturma, büyük bir listeyi filtreleme veya bir tıklamaya doğrudan yanıt vermeyen ilgili arayüz öğelerini güncelleme yer alır. Bu güncellemeler kesintiye uğratılabilir.
Eşzamanlılıkla nasıl çalışır: `startTransition` API'sini kullanarak, belirli durum güncellemelerini geçiş olarak işaretleyebilirsiniz. React'in zamanlayıcısı daha sonra bu güncellemeleri daha düşük bir öncelikle ele alacak ve daha acil bir güncelleme meydana gelirse bunları kesintiye uğratabilecektir. Bu, acil olmayan bir güncelleme (büyük bir listeyi render etmek gibi) devam ederken, acil güncellemelerin (bir arama çubuğuna yazmak gibi) önceliklendirilmesini ve arayüzün duyarlı kalmasını sağlar.
Küresel Örnek: Bir seyahat rezervasyon sitesini düşünün. Bir kullanıcı yeni bir varış noktası seçtiğinde, bu bir dizi güncellemeyi tetikleyebilir: uçuş verilerini çekme, otel müsaitliğini güncelleme ve bir harita oluşturma. Kullanıcı, ilk güncellemeler hala işlenirken seyahat tarihlerini hemen değiştirmeye karar verirse, `startTransition` API'si React'in uçuş/otel güncellemelerini duraklatmasına, acil tarih değişikliğini işlemesine ve ardından yeni tarihlere göre uçuş/otel çekimini potansiyel olarak devam ettirmesine veya yeniden başlatmasına olanak tanır. Bu, karmaşık güncelleme dizisi sırasında arayüzün donmasını önler.
Kod Parçacığı (Örnek):
import { useState, useTransition } from 'react';
function SearchResults() {
const [isPending, startTransition] = useTransition();
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const handleQueryChange = (e) => {
const newQuery = e.target.value;
setQuery(newQuery);
// Bu güncellemeyi bir geçiş olarak işaretle
startTransition(() => {
// Sonuçları çekmeyi simüle et, bu kesintiye uğratılabilir
fetchResults(newQuery).then(res => setResults(res));
});
};
return (
{isPending && Sonuçlar yükleniyor...}
{results.map(item => (
- {item.name}
))}
);
}
4. Kütüphaneler ve Ekosistem Entegrasyonu
Eşzamanlı Mod'un faydaları, React'in temel özellikleriyle sınırlı değildir. Tüm ekosistem adapte oluyor. Yönlendirme çözümleri veya durum yönetimi araçları gibi React ile etkileşime giren kütüphaneler de daha akıcı bir deneyim sağlamak için eşzamanlılıktan yararlanabilir.
Örnek: Bir yönlendirme kütüphanesi, sayfalar arasında gezinmek için geçişleri kullanabilir. Bir kullanıcı, mevcut sayfa tam olarak render edilmeden önce sayfadan ayrılırsa, yönlendirme güncellemesi sorunsuz bir şekilde kesintiye uğratılabilir veya iptal edilebilir ve yeni gezinme öncelik kazanabilir. Bu, kullanıcının her zaman amaçladığı en güncel görünümü görmesini sağlar.
Eşzamanlı Özellikler Nasıl Etkinleştirilir ve Kullanılır
Eşzamanlı Mod temel bir değişiklik olsa da, özelliklerini etkinleştirmek genellikle basittir ve özellikle yeni uygulamalar için veya Suspense ve Transitions gibi özellikleri benimserken genellikle minimum kod değişikliği gerektirir.
1. React Sürümü
Eşzamanlı özellikler React 18 ve sonraki sürümlerde mevcuttur. Uyumlu bir sürüm kullandığınızdan emin olun:
npm install react@latest react-dom@latest
2. Kök API (`createRoot`)
Eşzamanlı özellikleri seçmenin birincil yolu, uygulamanızı bağlarken yeni `createRoot` API'sini kullanmaktır:
// index.js veya main.jsx
import ReactDOM from 'react-dom/client';
import App from './App';
const container = document.getElementById('root');
const root = ReactDOM.createRoot(container);
root.render( );
`createRoot` kullanmak, otomatik gruplama, geçişler ve Suspense dahil olmak üzere tüm eşzamanlı özellikleri otomatik olarak etkinleştirir.
Not: Eski `ReactDOM.render` API'si eşzamanlı özellikleri desteklemez. Eşzamanlılığın kilidini açmak için `createRoot`'a geçiş yapmak önemli bir adımdır.
3. Suspense Uygulama
Daha önce gösterildiği gibi, Suspense, asenkron işlemler gerçekleştiren bileşenleri bir <Suspense>
sınırı ile sarmalayarak ve bir fallback
prop'u sağlayarak uygulanır.
En İyi Uygulamalar:
- Yükleme durumlarını ayrıntılı bir şekilde yönetmek için
<Suspense>
sınırlarını iç içe yerleştirin. - Daha temiz veri çekme mantığı için Suspense ile entegre olan özel hook'lar kullanın.
- Suspense için birinci sınıf desteğe sahip olan Relay veya Apollo Client gibi kütüphaneleri kullanmayı düşünün.
4. Geçişleri Kullanma (`startTransition`)
Acil olmayan arayüz güncellemelerini belirleyin ve bunları startTransition
ile sarmalayın.
Ne zaman kullanılır:
- Bir kullanıcı yazdıktan sonra arama sonuçlarını güncelleme.
- Rotalar arasında gezinme.
- Büyük listeleri veya tabloları filtreleme.
- Kullanıcı etkileşimini hemen etkilemeyen ek verileri yükleme.
Örnek: Bir tabloda görüntülenen büyük bir veri kümesinin karmaşık filtrelenmesi için, filtre sorgu durumunu ayarlarsınız ve ardından tablodaki satırların gerçek filtrelenmesi ve yeniden render edilmesi için startTransition
'ı çağırırsınız. Bu, kullanıcının filtre kriterlerini tekrar hızla değiştirmesi durumunda, önceki filtreleme işleminin güvenli bir şekilde kesintiye uğratılabilmesini sağlar.
Küresel Kitleler için Kesintili Render'ın Faydaları
Kesintili render ve Eşzamanlı Mod'un avantajları, çeşitli ağ koşullarına ve cihaz yeteneklerine sahip küresel bir kullanıcı tabanı düşünüldüğünde daha da artar.
- İyileştirilmiş Algılanan Performans: Daha yavaş bağlantılarda veya daha az güçlü cihazlarda bile, arayüz duyarlı kalır. Kullanıcılar daha hızlı bir uygulama deneyimi yaşarlar çünkü kritik etkileşimler asla uzun süre engellenmez.
- Gelişmiş Erişilebilirlik: Kullanıcı etkileşimlerini önceliklendirerek, uygulamalar yardımcı teknolojilere güvenen veya tutarlı bir şekilde duyarlı bir arayüzden yararlanan bilişsel bozuklukları olan kullanıcılar için daha erişilebilir hale gelir.
- Azalan Hayal Kırıklığı: Genellikle farklı zaman dilimlerinde ve çeşitli teknik kurulumlarla çalışan küresel kullanıcılar, donmayan veya gecikmeyen uygulamaları takdir eder. Akıcı kullanıcı deneyimi, daha yüksek katılım ve memnuniyete yol açar.
- Daha İyi Kaynak Yönetimi: CPU ve belleğin genellikle kısıtlı olduğu mobil cihazlarda veya eski donanımlarda, kesintili render React'in kaynakları verimli bir şekilde yönetmesine olanak tanır, kritik olanlara yol açmak için temel olmayan görevleri duraklatır.
- Cihazlar Arasında Tutarlı Deneyim: Bir kullanıcı Silikon Vadisi'nde yüksek teknolojili bir masaüstünde veya Güneydoğu Asya'da bütçeli bir akıllı telefonda olsun, uygulamanın temel duyarlılığı korunabilir, bu da donanım ve ağ yeteneklerindeki boşluğu kapatır.
Dünya çapındaki öğrenciler tarafından kullanılan bir dil öğrenme uygulamasını düşünün. Bir öğrenci yeni bir ders indirirken (potansiyel olarak uzun bir görev), başka bir öğrenci hızlı bir kelime sorusunu yanıtlamaya çalışıyorsa, kesintili render, indirme devam etse bile kelime sorusunun anında yanıtlanmasını sağlar. Bu, anında geri bildirimin öğrenme için hayati olduğu eğitim araçları için çok önemlidir.
Potansiyel Zorluklar ve Dikkat Edilmesi Gerekenler
Eşzamanlı Mod önemli avantajlar sunarken, benimsemesi aynı zamanda bir öğrenme eğrisi ve bazı hususları da içerir:
- Hata Ayıklama (Debugging): Asenkron ve kesintili işlemlerde hata ayıklamak, senkron kodda hata ayıklamaktan daha zor olabilir. Yürütme akışını ve görevlerin ne zaman duraklatılabileceğini veya devam ettirilebileceğini anlamak dikkatli bir yaklaşım gerektirir.
- Zihinsel Model Değişimi: Geliştiricilerin düşüncelerini tamamen sıralı bir yürütme modelinden daha eşzamanlı, olay güdümlü bir yaklaşıma ayarlamaları gerekir. `startTransition` ve Suspense'in sonuçlarını anlamak anahtardır.
- Harici Kütüphaneler: Tüm üçüncü taraf kütüphaneler eşzamanlılığa duyarlı olacak şekilde güncellenmemiştir. Engelleyici işlemler gerçekleştiren eski kütüphaneleri kullanmak yine de arayüz donmalarına yol açabilir. Bağımlılıklarınızın uyumlu olduğundan emin olmak önemlidir.
- Durum Yönetimi: React'in yerleşik eşzamanlılık özellikleri güçlü olsa da, karmaşık durum yönetimi senaryoları, tüm güncellemelerin eşzamanlı paradigma içinde doğru ve verimli bir şekilde ele alındığından emin olmak için dikkatli bir değerlendirme gerektirebilir.
React Eşzamanlılığının Geleceği
React'in eşzamanlılık yolculuğu devam ediyor. Ekip, zamanlayıcıyı iyileştirmeye, yeni API'ler sunmaya ve geliştirici deneyimini geliştirmeye devam ediyor. Offscreen API gibi özellikler (bileşenlerin kullanıcı tarafından algılanan arayüzü etkilemeden render edilmesine olanak tanıyan, ön render veya arka plan görevleri için kullanışlı) eşzamanlı render ile neler başarılabileceğinin olanaklarını daha da genişletiyor.
Web giderek daha karmaşık hale geldikçe ve kullanıcıların performans ve duyarlılık beklentileri artmaya devam ettikçe, eşzamanlı render sadece bir optimizasyon değil, küresel bir kitleye hitap eden modern, ilgi çekici uygulamalar oluşturmak için bir zorunluluk haline geliyor.
Sonuç
React Eşzamanlı Modu ve onun temel kavramı olan kesintili render, kullanıcı arayüzleri oluşturma şeklimizde önemli bir evrimi temsil eder. React'in render görevlerini duraklatmasına, devam ettirmesine ve önceliklendirmesine olanak tanıyarak, yalnızca performanslı değil, aynı zamanda ağır yük altında veya kısıtlı ortamlarda bile inanılmaz derecede duyarlı ve dayanıklı uygulamalar oluşturabiliriz.
Küresel bir kitle için bu, daha adil ve keyifli bir kullanıcı deneyimi anlamına gelir. Kullanıcılarınız uygulamanıza Avrupa'daki yüksek hızlı bir fiber bağlantıdan veya gelişmekte olan bir ülkedeki bir hücresel ağdan erişiyor olsun, Eşzamanlı Mod, uygulamanızın hızlı ve akıcı hissetmesini sağlamaya yardımcı olur.
Suspense ve Transitions gibi özellikleri benimsemek ve yeni Kök API'sine geçmek, React'in tüm potansiyelini ortaya çıkarmak için çok önemli adımlardır. Bu kavramları anlayıp uygulayarak, dünya çapındaki kullanıcıları gerçekten memnun eden yeni nesil web uygulamaları oluşturabilirsiniz.
Önemli Çıkarımlar:
- React'in Eşzamanlı Modu, senkron engellemeden kurtularak kesintili render'a olanak tanır.
- Suspense, otomatik gruplama ve Transitions gibi özellikler bu eşzamanlı temel üzerine kurulmuştur.
- Eşzamanlı özellikleri etkinleştirmek için
createRoot
kullanın. - Acil olmayan güncellemeleri belirleyin ve
startTransition
ile işaretleyin. - Eşzamanlı render, özellikle çeşitli ağ koşulları ve cihazlarda küresel kullanıcılar için kullanıcı deneyimini önemli ölçüde iyileştirir.
- Optimum performans için React'in gelişen eşzamanlılık özellikleriyle güncel kalın.
Projelerinizde Eşzamanlı Mod'u bugün keşfetmeye başlayın ve herkes için daha hızlı, daha duyarlı ve daha keyifli uygulamalar oluşturun.